/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-03-07     Hao       the first version
 */
#ifndef ENCODER_H
#define ENCODER_H

#include <stdint.h>

/**
 *  Direction structure
 */
enum Directions
{
    CW = 1,     // 顺时针
    CCW = -1,   // 逆时针
    UNKNOWN = 0 // 未定义
};

/**
 *  我做好的传感器定义
 */
enum EncoderDevice
{
    AS5600 = 0,
    MT6701 = 1,
};

class Encoder
{
public:
    Encoder(EncoderDevice device);
    ~Encoder();

    // 传感器初始化时，需要调用此函数
    void init();

    // 获取当前累加角度(-无穷 - +无穷，rad)
    float getAngle();

    // 获取当前速度（rad/s）
    float getVelocity();

    // 获取机械角度，不带累加（0-2PI）
    float getMechanicalAngle();

    // 获取完整圈数
//    int32_t getFullRotations();

    // 此函数需要不断被调用
    void update();

    // 暂时没用
//    float min_elapsed_time = 0.000100;

private:
    EncoderDevice device_;

    // 返回传感器角度（0-2PI）
    float getSensorAngle();

    // 速度
    float velocity_;
    // 为了计算累加角度用的
    float angle_prev_;
    uint64_t angle_prev_ts_;
    // 为了计算速度用的
    float vel_angle_prev_;
    uint64_t vel_angle_prev_ts_;
    // 已经转过的完整圈数，用于获取累加角度和速度
    int32_t full_rotations_;
    int32_t vel_full_rotations_;
};

#endif
